package org.atovio.structure.map;

import org.atovio.structure.adt.Map;
import org.atovio.structure.set.HashSet;

/**
 * 哈希映射类
 * @author AtoVio, Winter Yuan
 * @version 1.0
 */
public class HashMap<K,V> implements Map<K,V> {

    // 散列集合
    HashSet<KeyValue<K, V>> set;

    // 构造指定容量length的HashMap
    public HashMap(int length){
        this.set = new HashSet<>(length);
    }

    public HashMap(){
        this.set = new HashSet<>();
    }

    /**
     * 根据关键字查找元素
     * @param key 关键字
     * @return 查找成功返回元素值value；否则返回null
     */
    @Override
    public V get(K key) {
        // 查找元素
        KeyValue<K,V> target = this.set.search(new KeyValue<>(key,null));
        return target != null ? target.value : null;
    }

    /**
     * 添加映射元素。如果映射元素已存在，替换掉其中的映射值。我觉得这样不安全呀。
     * @param key 关键字
     * @param value 映射值
     * @return 返回true
     */
    @Override
    public boolean put(K key, V value) {
        KeyValue<K,V> kv = new KeyValue<>(key,value);
        if (!this.set.add(kv))
            this.set.search(kv).value = value;
        return true;
    }

    /**
     * 删除关键字为key的元素，返回被删除元素的值
     * @param key 关键字
     * @return 被删元素的值
     */
    @Override
    public V remove(K key) {
        return this.set.remove(new KeyValue<>(key, null)).value;
    }
}
